/**
 * 在这里定义与canvas画布图片相关的路由处理函数，供/router/image.js模块使用
 */

// 导入db模块
const db = require('../db/index')
// 导入文件系统模块
const fs = require('fs')
const path = require('path')

// 服务器基础域名
const SERVER_DOMAIN = 'http://localhost:3333'

// 从图片URL中提取文件名的辅助函数
const getFileNameFromUrl = (imageUrl) => {
  // 从URL中提取文件名，例如：http://localhost:3333/canvas-images/xxx.png -> xxx.png
  const urlParts = imageUrl.split('/')
  return urlParts[urlParts.length - 1]
}

// 删除磁盘上的图片文件
const deleteImageFile = (imageUrl) => {
  try {
    const fileName = getFileNameFromUrl(imageUrl)
    const filePath = path.join(__dirname, '../public/canvas-images', fileName)
    
    // 检查文件是否存在
    if (fs.existsSync(filePath)) {
      fs.unlinkSync(filePath)
      console.log('成功删除文件:', filePath)
      return true
    } else {
      console.log('文件不存在:', filePath)
      return false
    }
  } catch (error) {
    console.error('删除文件时出错:', error)
    return false
  }
}

// 上传图片：生成图片的访问路径，并返回给前端
exports.uploadImage = (req, res) => {
  try {
    console.log('req.file:', req.file)
    // 验证文件是否存在
    if (!req.file) {
      console.log('上传失败：req.file 为空');
      return res.status(400).json({
        code: 400,
        message: '未上传Canvas图片'
      });
    }

    console.log('上传成功，文件信息:', {
      filename: req.file.filename,
      originalname: req.file.originalname,
      size: req.file.size,
      mimetype: req.file.mimetype
    });

    // 生成可访问的图片URL
    // 图片存储路径：public/canvas-images/xxx.png
    // 访问URL：http://localhost:3333/canvas-images/xxx.png
    const canvasImageUrl = `${SERVER_DOMAIN}/canvas-images/${req.file.filename}`;

    // 返回结果
    res.status(200).json({
      code: 200,
      message: 'Canvas图片上传成功',
      data: {
        imageUrl: canvasImageUrl,
        fileName: req.file.filename,
        size: req.file.size // 文件大小（字节）
      }
    })
  } catch (error) {
    res.status(500).json({
      code: 500,
      message: 'Canvas图片上传失败',
      error: error.message
    })
  }
}

// 保存图片
exports.saveImage = (req, res) => {
  const { imgUrl } = req.body
  // 从认证中间件获取用户ID
  const userId = req.user.id
  
  const sqlStr = 'insert into image set url=?, user_id=?'
  db.query(sqlStr, [imgUrl, userId], (err, results) => {
    if (err) {
      return res.status(500).json({ 
        code: 500, 
        message: err.message 
      })
    }
    if (results.affectedRows !== 1) {
      return res.status(500).json({ 
        code: 500, 
        message: '保存图片失败' 
      })
    }
    res.status(200).json({ 
      code: 200, 
      message: '保存图片成功' 
    })
    console.log('保存图片成功url:', imgUrl, '用户ID:', userId)
  })
}

// 获取图片列表
exports.getImageList = (req, res) => {
  const userId = req.user.id
  const sqlStr = 'select * from image where user_id = ?'
  db.query(sqlStr, [userId], (err, results) => {
    if (err) {
      return res.status(500).json({
        code: 500,
        message: err.message
      })
    }
    res.status(200).json({
      code: 200,
      message: '获取图片列表成功',
      data: results
    })
    console.log('获取图片列表成功results:', results)
  })
}

// 删除图片（软删除）
exports.deleteImage = (req, res) => {
  const { id } = req.body
  const sqlStr = 'update image set is_deleted = 1 where id = ?'
  db.query(sqlStr, [id], (err, results) => {
    if (err) {
      return res.status(500).json({
        code: 500,
        message: err.message
      })
    }
    if (results.affectedRows !== 1) {
      return res.status(500).json({
        code: 500,
        message: '删除图片失败'
      })
    }
    res.status(200).json({
      code: 200,
      message: '删除图片成功'
    })
  })
}

// 恢复图片
exports.restoreImage = (req, res) => {
  const { id } = req.body
  
  // 先查询图片URL，检查文件是否存在
  const selectSql = 'select url from image where id = ?'
  db.query(selectSql, [id], (err, results) => {
    if (err) {
      return res.status(500).json({
        code: 500,
        message: err.message
      })
    }
    
    if (results.length === 0) {
      return res.status(404).json({
        code: 404,
        message: '图片不存在'
      })
    }
    
    const imageUrl = results[0].url
    const fileName = getFileNameFromUrl(imageUrl)
    const filePath = path.join(__dirname, '../public/canvas-images', fileName)
    
    // 检查文件是否存在
    if (!fs.existsSync(filePath)) {
      return res.status(400).json({
        code: 400,
        message: '图片文件不存在，无法恢复'
      })
    }
    
    // 恢复数据库记录
    const updateSql = 'update image set is_deleted = 0 where id = ?'
    db.query(updateSql, [id], (err, results) => {
      if (err) {
        return res.status(500).json({
          code: 500,
          message: err.message
        })
      }
      if (results.affectedRows !== 1) {
        return res.status(500).json({
          code: 500,
          message: '恢复图片失败'
        })
      }
      res.status(200).json({
        code: 200,
        message: '恢复图片成功'
      })
    })
  })
}

// 永久删除图片
exports.permanentlyDeleteImage = (req, res) => {
  const { id } = req.body
  
  // 先查询图片URL，然后删除文件，最后删除数据库记录
  const selectSql = 'select url from image where id = ?'
  db.query(selectSql, [id], (err, results) => {
    if (err) {
      return res.status(500).json({
        code: 500,
        message: err.message
      })
    }
    
    if (results.length === 0) {
      return res.status(404).json({
        code: 404,
        message: '图片不存在'
      })
    }
    
    const imageUrl = results[0].url
    
    // 删除磁盘上的文件（只有在不被其他记录使用时才删除）
    let fileDeleted = false
    fileDeleted = deleteImageFile(imageUrl)
    
    // 删除数据库记录
    const deleteSql = 'delete from image where id = ?'
    db.query(deleteSql, [id], (err, results) => {
      if (err) {
        return res.status(500).json({
          code: 500,
          message: err.message
        })
      }
      if (results.affectedRows !== 1) {
        return res.status(500).json({
          code: 500,
          message: '永久删除图片失败'
        })
      }
      
      // 返回成功信息，包含文件删除状态
      let message = '永久删除图片成功'
      if (fileDeleted) {
        message += '（文件已删除）'
      } else {
        message += '（文件删除失败，但数据库记录已删除）'
      }
      
      res.status(200).json({
        code: 200,
        message: message
      })
    })
  })
}